use crate::stock::stocks_board::StockBoard;
use crate::REQWEST_CLIENT;
use anyhow::Result;


///上证系列指数: https://quote.eastmoney.com/center/gridlist.html#index_sh
///
/// pn: u16 page-number start from 1,
///
/// pz: u16 page-size e.g. 20
///
pub async fn indexes_sh(pn: u16, pz: u16) -> Result<StockBoard> {
    // https://88.push2.eastmoney.com/api/qt/clist/get?cb=jQuery1124021987847982316056_1721895281347&pn=2&pz=20&po=0&np=1&ut=bd1d9ddb04089700cf9c27f6f7426281&fltt=2&invt=2&dect=1&wbp2u=|0|0|0|web&fid=f12&fs=m:1+s:2&fields=f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f12,f13,f14,f15,f16,f17,f18,f20,f21,f23,f24,f25,f26,f22,f33,f11,f62,f128,f136,f115,f152&_=1721895281504

    let host = "88.push2.eastmoney.com";

    //     cb: jQuery1124021987847982316056_1721895281347
    // pn: 2
    // pz: 20
    // po: 1
    // np: 1
    // ut: bd1d9ddb04089700cf9c27f6f7426281
    // fltt: 2
    // invt: 2
    // dect: 1
    // wbp2u: |0|0|0|web
    // fid: f3
    // fs: m:1 s:2
    // fields: f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f12,f13,f14,f15,f16,f17,f18,f20,f21,f23,f24,f25,f26,f22,f33,f11,f62,f128,f136,f115,f152
    // _: 1721895281441

    // Query String Parameters:
    //cb: jQuery112404647052438469883_1711520292103
    // let pn= 1;
    // let pz= 20;
    let po = 0;
    let np = 1;
    let ut = utils::generate_random_hex_string(32); //"bd1d9ddb04089700cf9c27f6f7426281";
    let fltt = 2;
    let invt = 2;
    let dect = 1;
    let wbp2u = "|0|0|0|web";
    let fid = "f12";
    let fs = "m:1+s:2";
    let fields =
        "f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f12,f13,f14,f15,f16,f17,f18,f20,f21,f23,f24,f25,f26,f22,f33,f11,f62,f128,f136,f115,f152";
    let t_ = utils::duration_ms_since_epoch(); //1711520292104;

    let request_url = format!(
        "https://{host}/api/qt/clist/get?pn={pn}&pz={pz}&po={po}&np={np}&ut={ut}&fltt={fltt}&invt={invt}&dect={dect}&wbp2u={wbp2u}&fid={fid}&fs={fs}&fields={fields}&_={t_}"
    );
    println!("\n (indexes_sh) request_url= {}\n", request_url);

    let response = REQWEST_CLIENT.get(request_url)
        .header(reqwest::header::ACCEPT, "*/*")
        .header(reqwest::header::ACCEPT_ENCODING, "gzip, deflate, br")
        .header(reqwest::header::ACCEPT_LANGUAGE, "zh-CN,zh;q=0.9,en;q=0.8")
        .header(reqwest::header::CACHE_CONTROL, "no-cache")
        .header(reqwest::header::CONNECTION, "keep-alive")
        // .header(reqwest::header::COOKIE, "qgqp_b_id=d6299473145338f68687834ba37fa719; st_si=77687174285423; AUTH_FUND.EASTMONEY.COM_GSJZ=AUTH*TTJJ*TOKEN; EMFUND0=01-16%2016%3A57%3A06@%23%24%u4E2D%u822A%u65B0%u8D77%u822A%u7075%u6D3B%u914D%u7F6E%u6DF7%u5408A@%23%24005537; EMFUND1=01-16%2017%3A04%3A53@%23%24%u91D1%u4FE1%u6D88%u8D39%u5347%u7EA7%u80A1%u7968A@%23%24006692; EMFUND2=01-16%2020%3A01%3A56@%23%24%u5357%u65B9%u4E0A%u8BC1380ETF@%23%24510290; EMFUND3=01-29%2015%3A02%3A07@%23%24%u534E%u590F%u4E2D%u8BC1%u5168%u6307%u623F%u5730%u4EA7ETF@%23%24515060; EMFUND4=01-30%2014%3A41%3A22@%23%24%u534E%u6CF0%u67CF%u745E%u6D88%u8D39%u6210%u957F%u6DF7%u5408@%23%24001069; EMFUND5=01-30%2014%3A45%3A59@%23%24%u5E7F%u53D1%u6052%u751F%u6D88%u8D39%28QDII-ETF%29@%23%24159699; EMFUND6=01-30%2014%3A47%3A24@%23%24%u5357%u65B9%u7EA2%u5229%u4F4E%u6CE250ETF@%23%24515450; EMFUND7=01-31%2015%3A21%3A23@%23%24%u56FD%u8054%u4E2D%u8BC1%u7164%u70AD%u6307%u6570%28LOF%29A@%23%24168204; EMFUND8=02-02%2008%3A34%3A56@%23%24%u666F%u987A%u957F%u57CE%u652F%u67F1%u4EA7%u4E1A%u6DF7%u5408@%23%24260117; EMFUND9=02-02 10:30:22@#$%u897F%u90E8%u5229%u5F97%u805A%u79BE%u6DF7%u5408A@%23%24007423; st_asi=delete; HAList=ty-1-513130-%u6052%u751F%u79D1%u6280ETF%2Cty-0-300078-%u601D%u521B%u533B%u60E0%2Cty-0-300486-%u4E1C%u6770%u667A%u80FD%2Cty-1-513360-%u6559%u80B2ETF%2Cty-0-300478-%u676D%u5DDE%u9AD8%u65B0%2Cty-0-301589-N%u8BFA%u74E6%2Cty-1-603135-%u4E2D%u91CD%u79D1%u6280%2Cty-0-000001-%u5E73%u5B89%u94F6%u884C%2Cty-0-002400-%u7701%u5E7F%u96C6%u56E2%2Cty-1-601127-%u8D5B%u529B%u65AF; st_pvi=47260449691882; st_sp=2024-01-12%2017%3A28%3A27; st_inirUrl=https%3A%2F%2Fwww.google.com.hk%2F; st_sn=438; st_psi=20240226102321941-113200301321-9024721593")
        .header(reqwest::header::HOST, format!("{host}"))
        .header(reqwest::header::PRAGMA, "no-cache")
        .header(
            reqwest::header::REFERER,
            "https://quote.eastmoney.com/center/gridlist.html#index_sh"
        )
        .header(
            reqwest::header::USER_AGENT,
            "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36"
        )
        .header(
            "Sec-Ch-Ua",
            "\"Not A(Brand\";v=\"99\", \"Google Chrome\";v=\"121\", \"Chromium\";v=\"121\""
        )
        .header("Sec-Ch-Ua-Mobile", "?0")
        .header("Sec-Ch-Ua-Platform", "\"macOS\"")
        .header("Sec-Fetch-Dest", "empty")
        .header("Sec-Fetch-Mode", "cors")
        .header("Sec-Fetch-Site", "same-origin")
        .send().await?;

    let body = response.text().await?;

    // println!("*** (indexes_sh) body={}\n\nhangqin\n\n", body);

    let fund: StockBoard = serde_json::from_str(&body)?;

    // println!("{:?}", fund);

    Ok(fund)
}

#[cfg(test)]
mod test {
    use crate::stock::stocks_board::{ StockBoard, StockBoardData };

    use super::*;

    #[tokio::test]
    async fn test_indexes_sh() {
        let stock_board = indexes_sh(1, 1000).await.unwrap();

        if let StockBoard { data: Some(StockBoardData { diff, .. }), .. } = stock_board {
            for (idx, df) in diff.iter().enumerate() {
                if idx < 10 || idx > diff.len() - 10 {
                    println!("[{:00004}] {},{} ", idx, df.f12, df.f14);
                } else {
                    print!(".");
                }
            }
        }
    }
}
